


#ifndef _HID_ICLASS_H__
#define _HID_ICLASS_H__

#include <stdint.h>

/*
所有函数执行成功返回0，否则返回非0。
*/

int IClass_ExtractData(uint8_t * ptr, uint16_t objectLength, uint8_t tag, uint8_t* pdata, uint8_t* dlen);

/*
初始化IClass
*/
int IClass_Init(void);
/*
描述：IClass上电
功能：打开天线，激活安全芯片。
*/
int IClass_PowerOn(void);
/*
描述：IClass下电
功能：关闭天线，关闭安全芯片。
*/
int IClass_PowerOff(void);


int IClass_PowerOnSE(void);

int IClass_PowerOffSE(void);


/*
描述：读取版本信息
功能：读取安全芯片版本信息，
参数：
	@ver[O]：版本信息数据。
	@len[O]：版本信息长度。
返回：
	0 == 成功，非0 == 失败
*/
int IClass_GetSEVersion(uint8_t ver[], uint8_t* len);


/*
描述：寻找IClass卡
功能：查找IClass卡，
参数：
	@csn[O]：传出找到的IClass的序列号。
返回：
	0 == 成功，非0 == 失败
*/
int IClass_Find(uint8_t csn[/*8*/]);

/*
描述：读取IClass卡内部卡号
功能：读取IClass卡内部卡号
参数：
	@content[O]：传出找到的IClass卡的内部卡号。
	@len[O]:内部卡号的长度。
返回：
	0 == 成功，非0 == 失败
*/

int IClass_GetEelementContent(uint8_t content[], uint8_t *len);


/*
描述：装载IClass卡的认证秘钥
功能：把IClass卡的认证秘钥装载到安全芯片。
参数：
	@persistent[I]：传出找到的IClass的序列号。
	@oid[I]:	状态的秘钥标识。最好不要与默认秘钥标识相同
	@key[I]:	装载的秘钥，8字节
返回：
	0 == 成功，非0 == 失败
*/
int IClass_LoadKey(uint8_t persistent, uint8_t oid[/*2*/], uint8_t key[/*8*/]);

/*
描述：切换IClass卡的认证秘钥
功能：切换IClass卡的某个app的认证秘钥。
参数：
	@app[I]:		要切换秘钥的app，该值为1或2。
	@new_oid[I]:	新的认证秘钥的标识
	@old_oid[I]:	旧的认证秘钥的标识
返回：
	0 == 成功，非0 == 失败
注意：
	在调用本函数前，需先调用“IClass_Select”，选择当前book和page。
*/
int IClass_RollKey(uint8_t app, uint8_t new_oid[/*2*/], uint8_t old_oid[/*2*/]);

/*
描述：选择IClass卡Book和Page
功能：设置IClass卡的当前Book和Page，后续操作均作用于选择的当前Book和Page。
参数：
	@book[I]:	选择的Book，该值为0或1。
	@page[I]:	选择的Page
	@config[O]:	执行成功后，返回当前Page的配置信息
返回：
	0 == 成功，非0 == 失败
注意：
*/
int IClass_Select(uint8_t book, uint8_t page, uint8_t config[/*8*/]);

/*
描述：认证IClass卡
功能：认证IClass卡的当前Book和Page，取得相应的访问权限。
参数：
	@app[I]:	要切换秘钥的app，该值为1或2。
	@oid[I]:	用于认证的秘钥的标识，秘钥存于安全芯片中。
返回：
	0 == 成功，非0 == 失败
注意：
	在调用本函数前，需先调用“IClass_Select”，设置当前认证的book和page。
*/
int IClass_Auth(uint8_t app, uint8_t oid[/*2*/]);
/*
描述：读取IClass卡
功能：读取IClass卡的当前Book和Page的某一块。
参数：
	@block[I]:	要读取的块的块号。
	@buf[O]:	存储数据的数组。
返回：
	0 == 成功，非0 == 失败
注意：
	在调用本函数前，需先调用“IClass_Auth”，取得读权限。
*/
int IClass_Read(uint8_t block, uint8_t buf[/*8*/]);

/*
描述：读取IClass卡
功能：读取IClass卡的当前Book和Page的某连续的4个块。
参数：
	@block[I]:	起始块的块号。
	@buf[O]:	存储数据的数组。
返回：
	0 == 成功，非0 == 失败
注意：
	在调用本函数前，需先调用“IClass_Auth”，取得读权限。
*/
int IClass_Read4(uint8_t block, uint8_t buf[/*32*/]);

/*
描述：写IClass卡
功能：把数据写入IClass卡的当前Book和Page的某一块。
参数：
	@block[I]:	要写入的块的块号。
	@buf[I]:	存储数据的数组。
返回：
	0 == 成功，非0 == 失败
注意：
	在调用本函数前，需先调用“IClass_Auth”，取得读权限。
*/
int IClass_Write(uint8_t block, uint8_t buf[/*8*/]);


/*
描述：获取默认用户秘钥ID
功能：获取IClass中某一app的默认秘钥的ID。
参数：
	@book[I]:	app所在的Book号，0或1。
	@page[I]:	app所在的Page号。
	@app[I]:	app号，1或2。
	@oid[O]:	对应的默认秘钥ID。
返回：
	0 == 成功，非0 == 失败
注意：
*/
int IClass_DefaultUserOID(uint8_t book, uint8_t page, uint8_t app, uint8_t oid[/*2*/]);


#endif





